package cn.bugstack.domain.order.adapter.repository;

import cn.bugstack.domain.order.model.aggregate.CreateOrderAggregate;
import cn.bugstack.domain.order.model.entity.OrderEntity;
import cn.bugstack.domain.order.model.entity.PayOrderEntity;
import cn.bugstack.domain.order.model.entity.ShopCartEntity;

import java.util.Date;
import java.util.List;

public interface IOrderRepository {

    // 保存新订单
    void doSaveOrder(CreateOrderAggregate orderAggregate);

    // 查询未支付订单
    OrderEntity queryUnPayOrder(ShopCartEntity shopCartEntity);

    // 更新订单支付信息
    void updateOrderPayInfo(PayOrderEntity payOrderEntity);

    // 更改订单为支付状态，手动传入支付时间
    void changeOrderPaySuccess(String orderId, Date payTime);

    // 更改订单为支付状态，支付时间，更新时间为调用时刻
    void changeMarketOrderPaySuccess(String orderId);

    // 查询处于等待支付状态 且 下单超过一分钟的订单
    List<String> queryNoPayNotifyOrder();

    // 查询超时订单, 处于等待支付状态 且 下单超过30分钟的的订单
    List<String> queryTimeoutCloseOrderList();

    // 修改订单为关单状态
    boolean changeOrderClose(String orderId);

    // 批量结算订单，更新数据库状态,发送结算消息至监听器，触发后续操作
    void changeOrderMarketSettlement(List<String> outTradeNoList);

    // 通过订单 id，查询订单信息
    OrderEntity queryOrderByOrderId(String orderId);

    // 查询用户Id 的支付订单，查询 pageSize条 用户Id 的支付订单，id > lastId
    List<OrderEntity> queryUserOrderList(String userId, Long lastId, Integer pageSize);

    // 通过用户ID 订单Id，查询支付订单的数据
    OrderEntity queryOrderByUserIdAndOrderId(String userId, String orderId);

    // 退单：根据用户Id 订单Id，将订单状态更改为 关闭
    boolean refundOrder(String userId, String orderId);

    // 更改订单状态 为待退款
    boolean refundMarketOrder(String userId, String orderId);
}
